import axios from 'axios'
import { getqAT, getqEU, getToken } from './auth'
import useUserStore from '@/store/modules/user'
import { isRef } from 'vue'
// import { ElMessage } from 'element-plus';

let qrequest = axios.create({
  baseURL: 'http://localhost:5000/crm', // 基础路径中会携带变量 /dev-api
  // baseURL: '/api', // 基础路径中会携带变量 /dev-api
  timeout: 5000, // 超时时间 5s
})

qrequest.interceptors.request.use((config) => {
  config.headers['Authorization'] = 'Bearer ' + getToken()
  config.headers['pcuss'] = getqAT() // 把常用的pcuss和encuser两个加入到headers中
  config.headers['EncUser'] = getqEU()
  return config
})

const newPcuss = (data, config) => {
  // 对其中的pcuss数据进行替换 被JSON.stringify处理过
  // 先还原为object对象
  let oldData = JSON.parse(data)
  oldData.pcuss = getqAT()
  // stringify处理
  // 对config进行赋值
  config.data = JSON.stringify(oldData)
  return config
}
// 这里会有重复请求问题,以及多个请求的重试
// 参考：https://segmentfault.com/a/1190000020210980
// 是否正在刷新的标记
let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
let pending = []
qrequest.interceptors.response.use(
  // 成功回调
  (response) => {
    return response.data
  },
  async (error) => {
    console.log('预警通拦截器', error)
    const { config } = error // 获取到错误的config
    // const { data } = config //获取到错误的data
    if (!isRefreshing) {
      isRefreshing = true
      // console.log('开始时', isRefreshing)
      // let message = ''
      // let status = error.response.status
      let userStore = useUserStore()
      try {
        console.log('刷新token')
        userStore.verfyQToken().then(() => {
          config.headers.pcuss = getqAT()
          pending.forEach((cb) => {
            cb(getqAT())
          })
          pending = []
          // console.log('试试看打印',getqAT());
          isRefreshing = false
          return qrequest(config)
        })
        // let newConfig = newPcuss(data,config)
        // console.log('试试看打印',pending);
        // return qrequest(newConfig)
      } catch (error) {
        console.log(error)
      }
      // return userStore.verfyQToken().then(() => {
      //     let newConfig = newPcuss(data, config)
      //     console.log(newConfig)
      //     pending.forEach((item) => item(data, config))
      //     pending = []
      //     return qrequest(newConfig)
      //   })
      //   .catch((error) => {
      //     console.log(error)
      //     return Promise.reject(error)
      //   })
      //   .finally(() => {
      //     isRefreshing = false
      //   })
      // try {
      //   let userStore = useUserStore()
      //   // 异步可能会比较慢
      //   userStore.verfyQToken().then(() => {
      //     // console.log('****',pending);
      //     pending.forEach((item) => item())
      //     // pending = []
      //     let newConfig = newPcuss(data,config)
      //     // 重新发送请求
      //     isRefreshing = false // 刷新完token再变为false，这样可以防止多次刷新问题
      //     return qrequest(newConfig)
      //   })
      // } catch (error) {
      //   console.log(error)
      // } finally {
      //   isRefreshing = false
      // }
    } else {
      // pending.push(error)
      // console.log(pending);
      return new Promise((resolve) => {
        pending.push((token) => {
          // let newConfig = newPcuss(data,config)
          config.headers.pcuss = token
          resolve(qrequest(config))
        })
      })
    }
    // console.log('最终', isRefreshing)
  },
  // else {
  //   return new Promise((resolve) => {
  //     console.log('%%%',config);
  //     // let pendingConfig = newPcuss(data,config)
  //     pending.push((data, config) => {
  //       // console.log('===一开始的', config);
  //       let pendingConfig = newPcuss(data,config)
  //       // console.log('&&&&',config);
  //       resolve(qrequest(pendingConfig))
  //     })
  //   })
  // }

  // ElMessage({
  //   type: 'error',
  //   message
  // })
)

export default qrequest
